Papers
BURG is a system for
code generation from intermediate expression trees. A mapping from intermediate representation
trees to machine instruction is defined by means of a tree grammar. A
production of the form n -> t (c)
defines a mapping of
tree pattern t
to non-terminal n
at cost
c
. Associated with each production is an action to take
when the production is selected. For example, ToddProebsting
gives the following example grammar:
[1] goal -> reg (0) [5] reg -> Plus(reg, reg) (2) [2] reg -> Reg (0) [6] addr -> reg (0) [3] reg -> Int (1) [7] addr -> Int (0) [4] reg -> Fetch(addr) (2) [8] addr -> Plus(reg, Int) (0)According to this grammar, the term
Fetch(Fetch(Plus(Reg,Int)))
has two coverings
corresponding to the derivations 4(4(6(5(2,3))))
and
4(4(8(2)))
.
As illustrated by this example, more than one covering of a tree is possible, corresponding to different ways to generate code. Each node can have several different parses because of overlapping patterns and chain rules. The costs associated with the productions express the cost of executing the associated machine instruction. The goal of a code generator is to find the lowest cost covering (i.e., lowest execution time) of an intermediate representation expression tree.
According to bottom-up rewriting theory (BURS) an intermediate representation tree can be translated to a sequence of instructions using the following strategy. In a bottom-up traversal all lowest-cost patterns that match each node are computed and associated with the node. This involves matching the righ-hand sides of the productions to the tree, taking into account earlier matches for sub-trees. Instructions are then selected in a top-down traversal that is driven by the goal non-terminal for the root of the tree.
This restricted form of rewriting can also be applied for simple type inference problems, for checking tree formats, and for tree simplifications.
-- EelcoVisser - 30 Apr 2001